home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue51 / Clinic / RunCmd.pas < prev   
Pascal/Delphi Source File  |  1999-09-09  |  2KB  |  69 lines

  1. unit RunCmd;
  2.  
  3. interface
  4.  
  5. procedure RunCommand(const Cmd, Params: String);
  6. //Extended version of RunCommand which can handle file associations
  7. procedure RunCommandEx(const Cmd, Params: String);
  8.  
  9. implementation
  10.  
  11. uses
  12.   SysUtils, Forms, ShellAPI, Windows;
  13.  
  14. procedure RunCommand(const Cmd, Params: String);
  15. var
  16.   SI: TStartupInfo;
  17.   PI: TProcessInformation;
  18.   CmdLine: String;
  19. begin
  20.   //Fill record with zero byte values
  21.   FillChar(SI, SizeOf(SI), 0);
  22.   //Set mandatory record field
  23.   SI.cb := SizeOf(SI);
  24.   //Ensure Windows mouse cursor reflects launch progress
  25.   SI.dwFlags := StartF_ForceOnFeedback;
  26.   //Set up command line
  27.   CmdLine := Cmd;
  28.   if Length(Params) > 0 then
  29.     CmdLine := CmdLine + #32 + Params;
  30.   //Try and launch child process. Raise exception on failure
  31.   Win32Check(
  32.     CreateProcess(
  33.       nil, PChar(CmdLine), nil, nil, False, 0, nil, nil, SI, PI));
  34.   //Wait until process has started its main message loop
  35.   WaitForInputIdle(PI.hProcess, Infinite);
  36.   //Close process and thread handles
  37.   CloseHandle(PI.hThread);
  38.   CloseHandle(PI.hProcess);
  39. end;
  40.  
  41. //Extended version of RunCommand which can handle file associations
  42. procedure RunCommandEx(const Cmd, Params: String);
  43. var
  44.   SEI: TShellExecuteInfo;
  45. begin
  46.   //Fill record with zero byte values
  47.   FillChar(SEI, SizeOf(SEI), 0);
  48.   //Set mandatory record field
  49.   SEI.cbSize := SizeOf(SEI);
  50.   //Ask for an open process handle
  51.   SEI.fMask := see_Mask_NoCloseProcess;
  52.   //Tell API which window any error dialogs should be modal to
  53.   SEI.Wnd := Application.Handle;
  54.   //Set up command line
  55.   SEI.lpFile := PChar(Cmd);
  56.   if Length(Params) > 0 then
  57.     SEI.lpParameters := PChar(Params);
  58.   SEI.nShow := sw_ShowNormal;
  59.   //Try and launch child process. Raise exception on failure
  60.   if not ShellExecuteEx(@SEI) then
  61.     Exit;
  62.   //Wait until process has started its main message loop
  63.   WaitForInputIdle(SEI.hProcess, Infinite);
  64.   //Close process handle
  65.   CloseHandle(SEI.hProcess);
  66. end;
  67.  
  68. end.
  69.